package org.grottarossa.template.data.pojo;

import java.sql.Timestamp;
import java.util.Date;
import java.util.GregorianCalendar;

import org.grottarossa.template.data.pojo.table.Cell;
import org.grottarossa.template.data.pojo.table.Record;

import org.grottarossa.template.drivers.DriverException;

/**
 *
 * La Classe rappresenta l'oggetto BasePojo. Il BasePojo viene utilizzato per definire in maniera
 * piu' dettagliata i business objects di dominio dell'applicazione.
 * Se ad esempio nel back-end sono presenti gli oggetti procedura e progetto questi saranno
 * serializzati in un oggetto Record a partire dalla rappresentazione del loro POJO che estende il BasePojo.
 *
 *
 * @author Marco Sabatini (sabatini.m@gmail.com)
 * @author Maurizio Farina (maurizio.farina@gmail.com)
 * @author Marco Trischitta (marco.trischitta@gmail.com)
 * @version %I%, %G%
 * @since 1.0
 *
 * */

public abstract class BasePojo
{
	public static String OBJECTREAD="OBJECTREAD"; //Date

	public BasePojo() {
	}

	public BasePojo(Record record) {
		this.initialize(record);
	}
	/**
	 * Il metodo inizializza un oggetto Record a partire dai membri del Pojo stesso.
	 * @throws DriverException
	 * */
	public abstract void initialize(Record record) ;
	/**
	 * Il metodo recupera i membri dell'oggetto.
	 * @return Record E' l'oggetto in cui vengono inseriti i membri del Pojo.
	 * */
	public abstract Record getRecord();

	/**
	 * Restituisce il valore di una cella del record verificando che esista. Se non esiste restituisce il
	 * valore di default passato in input.
	 * @param record
	 * @param cellName
	 * @param defaultValue
	 * @return
	 */
	public static Object getCellValue(Record record, String cellName, Object defaultValue)
	{
		Cell c = record.getCell(cellName);

		if(c == null)
			return defaultValue;

		if(c.getDataType() != null && c.getDataType().isCalendar())
		{
			if(c.getValue() instanceof Timestamp)
			{
				Timestamp app = (Timestamp) c.getValue();
				Date d = new Date(app.getTime());
				return d;
			}
			else
			{
				GregorianCalendar gc = (GregorianCalendar) c.getValue();
				return gc.getTime();
			}
		}

		return c.getValue();
	}
}
